package org.example.controller;

import lombok.extern.slf4j.Slf4j;
import org.example.anno.Log;
import org.example.pojo.Dept;
import org.example.pojo.Result;
import org.example.service.DeptService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;

import java.util.List;
//@RequestMapping("/depts")//将方法上公共的路径抽取到类上，这样方法上可省略不写
@RestController
@Slf4j
public class DeptController {
    @Autowired
    private DeptService deptService;
//    private static final Logger log= LoggerFactory.getLogger(DeptController.class);//固定的(可以用@Slf4j替代）
    //查询全部部门数据
//    @RequestMapping(value="/depts",method= RequestMethod.GET)//method指定请求方式
    @GetMapping("/depts")
    public Result list(){
        //System.out.println("查询全部的部门数据");
        log.info("查询全部的部门数据");
        List<Dept> deptlist= deptService.findAll();
        return Result.success(deptlist);
    }
    //删除部门数据
    //简单参数接收(资源路径?后面的参数): 方式一 (HttpServletRequest):不推荐
/*    @DeleteMapping("/depts")
    public Result delete(HttpServletRequest request){
        String idStr=request.getParameter("id");
        Integer id=Integer.parseInt(idStr);
        System.out.println("删除的部门id为"+id);
        return Result.success();
    }*/
    //方式二:@RequestParam
    //注意事项:一但声明了@RequestParam,该参数在请求时就必须传递,否则报错（required默认为true）
/*    @DeleteMapping("/depts")
    public Result delete(@RequestParam(value = "id",required = false) Integer id){
        System.out.println("删除的部门id为"+id);
        return Result.success();
    }*/
    //方式三：如果请求参数名与形参变量名相同，直接定义方法形参即可接收。（省略@RequestParam）//推荐
    @Log
    @DeleteMapping("/depts")
    public Result delete(Integer id){
//        System.out.println("删除的部门id为"+id);
            log.info("删除的部门id为{}",id);
        deptService.deleteById(id);
        return Result.success();
    }
    //添加部门数据
    //@RequestBody:将请求体中的json数据,转为java对象(前提:请求体中json数据的键名必须与java对象的属性名一致)
    @Log
    @PostMapping("/depts")
    public Result add(@RequestBody Dept dept){
//        System.out.println("添加的部门数据为"+dept);
        log.info("添加的部门数据为{}",dept);
        deptService.add(dept);
        return Result.success();
    }
    //depts/1，/depts/2 这种在url中传递的参数，我们称之为路径参数。
    //路径参数接收:使用@PathVariable注解
    //注意事项:一但声明了@PathVariable,该参数在请求时就必须传递,否则报错（required默认为true）

    //如果路径参数名与controller方法形参名称一致，@PathVariable注解的value属性是可以省略的。
//    @GetMapping("/depts/{id}")
//    public Result getById(@PathVariable("id") Integer deptid){
//        System.out.println("根据id查询部门数据 "+deptid);
//        return Result.success();
//    }
    //查询回显(当点击修改时）
    @GetMapping("/depts/{id}")
    public Result getById(@PathVariable Integer id){
//        System.out.println("根据id查询部门数据 "+id);
            log.info("根据id查询部门数据:{}",id);
       Dept dept=deptService.getById(id);
        return Result.success(dept);
    }
    //更新部门
    @Log
    @PutMapping("/depts")
    public Result updateById(@RequestBody Dept dept){
//        System.out.println("修改部门数据 "+dept);
        log.info("修改部门数据:{}",dept);
        deptService.update(dept);
        return Result.success();
    }

}
